package com.hzit.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hzit.config.StudentConverter;
import com.hzit.dto.StudentDTO;
import com.hzit.entity.Student;
import com.hzit.mapper.StudentMapper;
import com.hzit.service.IStudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@Service
@Slf4j
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {

	@Autowired
	private StringRedisTemplate redisTemplate;

	/**
	 * 1. 因为与数据库打交道，查询出的都是po对象，根据领域模型的规范，在service层传送数据需要转换为DTO对象
	 */
	@Override
	public List<StudentDTO> findAll() {
		List<StudentDTO> studentDTOS = null;
		//1.1 从redis中得到学生集合
		String str = redisTemplate.opsForValue().get("students");
		if(StrUtil.isNotBlank(str)){
			log.info("缓存命中...");
			//1.2 将学生字符串转换为集合
			studentDTOS = JSON.parseArray(str, StudentDTO.class);
		}else{
			log.info("查询数据库...");
			//1.1 查询出所有的学生集合(得到po数据)
			List<Student> list = this.list();
			//1.2 使用MapStruct将List<Student>转换为List<StudentDTO>集合
			studentDTOS =  StudentConverter.INSTANCE.entityList2DtoList(list);
			//1.3 将查询出来的结果放到redis
			redisTemplate.opsForValue().set("students",JSON.toJSONString(studentDTOS));
		}
		return studentDTOS;
	}

	/**
	 * 2. 添加学生到数据库
	 * @param studentDTO
	 */
	@Override
	public void addStudent(StudentDTO studentDTO) {
		//2.0 清空缓存 (在增、删除、改时都要清空缓存)
		redisTemplate.delete("students");
		//2.1 将dto转换为po对象
		Student student = StudentConverter.INSTANCE.dto2Entity(studentDTO);
		//2.2 将学生添加到数据库中
		this.save(student);
	}

	/**
	 * 3. 删除学生
	 * @param sid
	 */
	@Override
	public void delete(Integer sid) {
		//3.0 清空缓存 (在增、删除、改时都要清空缓存)
		redisTemplate.delete("students");
		this.removeById(sid);
	}
}
